package com.second.hand.trading.server.utils;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * IdFactoryUtil 工具类
 * 用于生成唯一的订单ID和文件ID，保证在高并发环境下生成的ID不重复。
 * 通过原子自增操作结合当前时间戳，生成唯一字符串ID。
 */
public class IdFactoryUtil {

    // 订单ID自增计数器，初始值为1，最大值9999，超过后循环
    private static AtomicInteger orderIdEnd = new AtomicInteger(1);
    // 文件ID自增计数器，初始值为1，最大值999，超过后循环
    private static AtomicInteger fileIdEnd = new AtomicInteger(1);

    /**
     * 生成唯一订单ID
     * 格式为：当前时间戳 + 4位自增数（范围10000~19999）
     * @return 唯一订单ID字符串
     */
    public static String getOrderId() {
        int newI;
        int ord;
        // 使用CAS操作保证线程安全地自增
        do {
            ord = orderIdEnd.get();
            newI = (ord + 1) % 10000; // 达到10000后归零
        } while (!orderIdEnd.compareAndSet(ord, newI));
        // 返回当前时间戳拼接自增数（+10000保证为4位数）
        return System.currentTimeMillis() + "" + (newI + 10000);
    }

    /**
     * 生成唯一文件ID
     * 格式为：当前时间戳 + 4位自增数（范围1000~1999）
     * @return 唯一文件ID字符串
     */
    public static String getFileId() {
        int newI;
        int ord;
        // 使用CAS操作保证线程安全地自增
        do {
            ord = fileIdEnd.get();
            newI = (ord + 1) % 1000; // 达到1000后归零
        } while (!fileIdEnd.compareAndSet(ord, newI));
        // 返回当前时间戳拼接自增数（+1000保证为4位数）
        return System.currentTimeMillis() + "" + (newI + 1000);
    }
}
